package com.bbzn.device.client.utils;

import com.alibaba.fastjson.JSONException;
import com.bbzn.device.client.constant.SMSConstant;
import com.github.qcloudsms.SmsMultiSender;
import com.github.qcloudsms.SmsMultiSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: wulongbo
 * @Date: 2021/3/18 16:59 （日期和时间）
 */
@Component
@Slf4j
public class VerPhoneCodeUtils {

    /**
     * 获取4位数验证码、并发送
     *
     * @param countryCode 国家码 款
     * @param phone       手机号码
     * @return
     * @throws Exception
     */
    public static Map<String, Object> getRandom(String countryCode, String phone) throws Exception {
        Map<String, Object> data = new HashMap<String, Object>();

        // 短信应用SDK AppID
        int appid = 1400329984; // 1400开头

        // 短信应用SDK AppKey
        String appkey = "de9a0f2ddbad0af8ed44a9ceb4f142c7";

        // 需要发送短信的手机号码
        String[] phoneNumbers = {phone};

        // 短信模板ID，需要在短信应用中申请
        // NOTE: 这里的模板ID`7839`只是一个示例，
        // 真实的模板ID需要在短信控制台中申请
        int templateId = 551926;

        // 签名
        // NOTE: 这里的签名"腾讯云"只是一个示例，
        // 真实的签名需要在短信控制台中申请，另外
        // 签名参数使用的是`签名内容`，而不是`签名ID`
        String smsSign = "把把智能科技";
        try {
            Integer ran = (int) (Math.random() * 900000) + 100000;
            String s = Integer.toString(ran);
            String[] params = {s};
            SmsMultiSender msender = new SmsMultiSender(appid, appkey);
            SmsMultiSenderResult result = msender.sendWithParam("86", phoneNumbers,
                    templateId, params, smsSign, "", "");  // 签名参数未提供或者为空时，会使用默认签名发送短信
            System.out.print(result);
            data.put("random", ran);
            //生成当前时间
            data.put("time", System.currentTimeMillis());
        } catch (HTTPException e) {
            // HTTP响应码错误
            e.printStackTrace();
        } catch (JSONException e) {
            // json解析错误
            e.printStackTrace();
        } catch (IOException e) {
            // 网络IO错误
            e.printStackTrace();
        }
	/*	//生成4位数验证码  sh
		Integer ran=(int)(Math.random()*900000)+100000;
		//发送短信
		//MainApp.sendRegister(countryCode, phone,ran);
		SmsSingleSender ss = new SmsSingleSender(1400329984,"de9a0f2ddbad0af8ed44a9ceb4f142c7");
		if("86".equals(countryCode)) {
			//国内
			ss.send(0,countryCode,phone,ran + "为您的注册验证码，请于5分钟内填写。如非本人操作，请忽略本短信。", "", "");
			log.info("------国内短信发送成功！----国家码-》-"+countryCode+"--手机号-》----" + phone);
		}else {
			//国际
			ss.send(0,countryCode,phone,ran + " is the registration verification code. Please enter this code in 5 minutes. If you didn't initiate the request, please disregard this message.", "", "");
			log.info("------国际短信发送成功！----国家码-》-"+countryCode+"--手机号-》----" + phone);
		}
		data.put("random",ran);
		//生成当前时间
		data.put("time", System.currentTimeMillis());
		return data;*/

        return data;
    }


    /**
     * SMS发送时效性短信
     *
     * @param appid        短信应用SDK AppID
     * @param appkey       短信应用SDK AppKey
     * @param smsSign      签名
     * @param countryCode  国际码
     * @param phoneNumbers 电话号码
     * @param templateId   模板id
     * @param params       短信可变参数列表
     * @return
     * @throws Exception
     * @throws Exception
     */
    public static Map<String, Object> smsDIYSend(int appid, String appkey, String smsSign, String countryCode, String[] phoneNumbers, int templateId, String[] params, String ran) throws Exception {
        Map<String, Object> data = new HashMap<String, Object>();
        try {
            if ("86".equals(countryCode)) {
                //国内
                SmsMultiSender msender = new SmsMultiSender(appid, appkey);
                SmsMultiSenderResult result = msender.sendWithParam(countryCode, phoneNumbers,
                        templateId, params, smsSign, "", "");  // 签名参数未提供或者为空时，会使用默认签名发送短信
            } else {
                //国际
                SmsMultiSender msender = new SmsMultiSender(appid, appkey);
                SmsMultiSenderResult result = msender.sendWithParam(countryCode, phoneNumbers,
                        templateId, params, null, "", "");  // 签名参数未提供或者为空时，会使用默认签名发送短信
            }
            data.put(SMSConstant.SMS_PHONE_PREFIX + phoneNumbers[0], ran);
            //生成当前时间
            data.put("time", System.currentTimeMillis());
        } catch (HTTPException e) {
            // HTTP响应码错误
            e.printStackTrace();
        } catch (org.json.JSONException e) {
            // json解析错误
            e.printStackTrace();
        } catch (IOException e) {
            // 网络IO错误
            e.printStackTrace();
        }
        return data;
    }

    /**
     * SMS自定义短信发送
     *
     * @param appid        短信应用SDK AppID
     * @param appkey       短信应用SDK AppKey
     * @param smsSign      签名
     * @param countryCode  国际码
     * @param phoneNumbers 电话号码
     * @param templateId   模板id
     * @param params       短信可变参数列表
     * @return
     * @throws Exception
     * @throws Exception
     */
    public static void smsDIYSend(int appid, String appkey, String smsSign, String countryCode, String[] phoneNumbers, int templateId, String[] params) throws Exception {
        try {
            if ("86".equals(countryCode)) {
                //国内
                SmsMultiSender msender = new SmsMultiSender(appid, appkey);
                SmsMultiSenderResult result = msender.sendWithParam(countryCode, phoneNumbers,
                        templateId, params, smsSign, "", "");  // 签名参数未提供或者为空时，会使用默认签名发送短信
            } else {
                //国际
                SmsMultiSender msender = new SmsMultiSender(appid, appkey);
                SmsMultiSenderResult result = msender.sendWithParam(countryCode, phoneNumbers,
                        templateId, params, null, "", "");  // 签名参数未提供或者为空时，会使用默认签名发送短信
            }
        } catch (HTTPException e) {
            // HTTP响应码错误
            e.printStackTrace();
        } catch (org.json.JSONException e) {
            // json解析错误
            e.printStackTrace();
        } catch (IOException e) {
            // 网络IO错误
            e.printStackTrace();
        }
    }


    //判断验证码时效性、正确性
    public static Map<String, String> SMSVerification(Long sendTime, Integer OldRandom, Integer newRandom) throws Exception {
        Map<String, String> result = new HashMap<String, String>();

        if (OldRandom.equals(newRandom)) {    //传入的验证码是否和发送验证码一致
//            long nowDate = (long) System.currentTimeMillis();
            double diff = sendTime - 2000;    //计算差值是否大于5分钟，否则验证码失效

            if (diff > 0) {

                result.put("result", "success");
            } else {
                result.put("result", "TimeOut");
            }
        } else {

            result.put("result", "registerCodeFail");
        }
        return result;
    }

    //判断验证码时效性、正确性
    public static Map<String, String> SMSVerification(Long sendTime, String OldRandom, String newRandom) throws Exception {
        Map<String, String> result = new HashMap<String, String>();

        if (OldRandom.equals(newRandom)) {    //传入的验证码是否和发送验证码一致
//            long nowDate = (long) System.currentTimeMillis();
            double diff = sendTime - 2000;    //计算差值是否大于5分钟，否则验证码失效

            if (diff > 0) {

                result.put("result", "success");
            } else {
                result.put("result", "TimeOut");
            }
        } else {

            result.put("result", "registerCodeFail");
        }
        return result;
    }


    /**
     * 	emq的webHook管理,设备触发围栏,发送短信给监管人
     * @return
     * @throws Exception
     */
    public static void emqWebHookSendMessage(String countryCode,String[] phoneNumbers,int templateId,String[] params)throws Exception {
        Map<String, Object> data = new HashMap<String,Object>();

        // 短信应用SDK AppID
        final int appid = 1400329984; // 1400开头

        // 短信应用SDK AppKey
        String appkey = "de9a0f2ddbad0af8ed44a9ceb4f142c7";

        String smsSign = "把把智能科技";
        try {
            if("86".equals(countryCode)) {
                //国内
//			ss.send(0,countryCode,phone,"【把把智能科技】您的验证码是: " +ran + "，请于5分钟内填写。如非本人操作，请忽略本短信。", "", "");
//			ss.send(0,countryCode,phone,"【把把智能科技】{1}消息： 人员：{2}已{3}了{4}，为保障设备安全，请勿向他人泄露此消息。", "", "");
                SmsMultiSender msender = new SmsMultiSender(appid, appkey);
                SmsMultiSenderResult result =  msender.sendWithParam(countryCode, phoneNumbers,
                        templateId, params, smsSign, "", "");  // 签名参数未提供或者为空时，会使用默认签名发送短信
                log.info("------国内短信发送成功！----国家码-》-"+countryCode+"--手机号-》----" + phoneNumbers);
            }else {
                //国际
                SmsMultiSender msender = new SmsMultiSender(appid, appkey);
                SmsMultiSenderResult result =  msender.sendWithParam(countryCode, phoneNumbers,
                        templateId, params, null, "", "");  // 签名参数未提供或者为空时，会使用默认签名发送短信
                log.info("------国际短信发送成功！----国家码-》-"+countryCode+"--手机号-》----" + phoneNumbers);
            }
        } catch (HTTPException e) {
            // HTTP响应码错误
            e.printStackTrace();
        } catch (org.json.JSONException e) {
            // json解析错误
            e.printStackTrace();
        } catch (IOException e) {
            // 网络IO错误
            e.printStackTrace();
        }
    }

}
